gtkmain: Let windows handle WM-related events before delivering to the grab_widget
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 7 Jan 2014 16:49:31 +0000 (17:49 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Wed, 22 Jan 2014 16:10:05 +0000 (17:10 +0100)
This makes it possible to move/resize client-side decorated windows that are
otherwise obscured by a GTK+ grab somewhere else, either a popover within the
window itself or a modal dialog above the window.

gtk/gtkmain.c
gtk/gtkwindow.c
gtk/gtkwindowprivate.h

index 40f0b058077baaa51c1e016b0f04aba3f5bd5340..c1b08cf131529acda21d84cd24ace05d6f7cec7c 100644 (file)
@@ -1568,6 +1568,12 @@ gtk_main_do_event (GdkEvent *event)
       event_widget = gtk_get_event_widget (event);
     }
 
+  if (GTK_IS_WINDOW (event_widget))
+    {
+      if (_gtk_window_check_handle_wm_event (event))
+        return;
+    }
+
   window_group = gtk_main_get_window_group (event_widget);
   device = gdk_event_get_device (event);
 
index 6f7ce0fb298f0cd9516dd44615d76c0b1255ca79..260f57aded96b2df4fc056f83529b66fac652770 100644 (file)
@@ -7704,6 +7704,27 @@ gtk_window_button_press_event (GtkWidget      *widget,
   return FALSE;
 }
 
+gboolean
+_gtk_window_check_handle_wm_event (GdkEvent *event)
+{
+  GtkWidget *widget;
+
+  widget = gtk_get_event_widget (event);
+
+  if (!GTK_IS_WINDOW (widget))
+    return FALSE;
+
+  if (event->type == GDK_BUTTON_PRESS ||
+      event->type == GDK_2BUTTON_PRESS)
+    return gtk_window_button_press_event (widget, &event->button);
+  else if (event->type == GDK_BUTTON_RELEASE)
+    gtk_window_button_release_event (widget, &event->button);
+  else if (event->type == GDK_MOTION_NOTIFY)
+    return gtk_window_motion_notify_event (widget, &event->motion);
+  else
+    return FALSE;
+}
+
 static void
 gtk_window_real_activate_default (GtkWindow *window)
 {
index d9f9f4d4a2f8abfeb3ef03df48d2698fc1228498..5395eb077be7eacf26e07e03fb728681bb102c59 100644 (file)
@@ -75,6 +75,8 @@ void _gtk_window_keys_foreach (GtkWindow               *window,
                                GtkWindowKeysForeachFunc func,
                                gpointer                 func_data);
 
+gboolean _gtk_window_check_handle_wm_event (GdkEvent  *event);
+
 /* --- internal (GtkAcceleratable) --- */
 gboolean        _gtk_window_query_nonaccels     (GtkWindow      *window,
                                                  guint           accel_key,